package com.kangyi.utils;

import com.kangyi.properties.JwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * @author Blank
 * @version 1.0
 */
@Slf4j
public class JwtUtil {

    @Autowired
    private JwtProperties jwtProperties;
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */


    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        String jti = UUID.randomUUID().toString(); // 生成唯一 jti
        claims.put("jti", jti); // 把 jti 存入 claims

        JwtBuilder builder = Jwts.builder()
                .setClaims(claims)
                .setId(jti)  // 设置 jti
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                .setExpiration(exp);

        return builder.compact();
    }


    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                    .parseClaimsJws(token)
                    .getBody();
            log.info("Token 解析成功: {}", claims);
            return claims;
        } catch (Exception e) {
            log.error("JWT 解析失败: {}", e.getMessage());
            throw new RuntimeException("JWT 解析失败", e);
        }
    }



    // 从 UserJWT 获取 jti（唯一标识）
    public static String getJtiFromUserToken(String secretKey,String token) {
        Claims claims = parseJWT(secretKey,token);
        return claims.getId(); // 返回 jti
    }

}